package com.sam.designpatterns

// Cloneable 接口代表 Prototype 角色
// WordDocument 文档，为 ConcretePrototype 角色
class WordDocument : Cloneable {

    // 文本
    var text: String = ""
    // 图片列表
    var imgs: ArrayList<String> = ArrayList()

    public override fun clone(): WordDocument {
        val doc = super.clone()  as WordDocument
        doc.imgs = this.imgs.clone() as ArrayList<String>
        return doc
    }

    fun showDocument() {
        println("-------- Word Document Start --------")
        println("Text:$text")
        println("Images:${imgs.joinToString(",")}")
        println("-------- Word Document End --------")
    }
}

// Client
fun main() {
    // 新建文档
    val originDoc = WordDocument()
    // 编辑的文档
    originDoc.text = "好的开始是成功的一半"
    originDoc.imgs.add("Img 1")
    originDoc.imgs.add("Img 2")
    originDoc.imgs.add("Img 3")
    originDoc.showDocument()

    // 以原始文档为原型，拷贝出副本
    val doc2 = originDoc.clone()
    // 修改文档副本
    doc2.text = "${doc2.text}, 然而还是要修改！"
    doc2.imgs.add("新增图片")
    doc2.showDocument()

    // 修改副本不会影响原始文档
    originDoc.showDocument()
}
